共计 4914 个字符,预计需要花费 13 分钟才能阅读完成。
背景
在之前的文章:使用 MySQL Exporter 监控MySQL 中介绍了使用 MySQL Exporter 监控多个数据库实例。
MySQL 有 Role 用于配置单独的低权限监控只读用户,在每个实例中创建的监控用户密码都是相同的。
而 Redis 则不具备 Role,往往不同的 redis 有且仅有一个密码,且不一致。
下面会介绍如何使用 使用 Redis Exporter 监控多组不同密码的 redis 实例。
环境
此次为全新部署,从0开始测试,不操作生产环境。
software | IP | port |
---|---|---|
Redis 5.0.14 | 192.168.2.11 | 6379 |
Redis 7.4.1 | 192.168.2.11 | 6380 |
redis_exporter 0.16.0 | 192.168.2.10 | 9104 |
Prometheus | 192.168.2.10 | 9090 |
实践
部署 redis
使用最简单的 docker 部署方式,部署2个 Redis 单实例,版本分别为 5.0.14 & 7.4.1
# 创建持久化数据目录
mkdir /usr/local/redis-test/5.0.14/data -p
mkdir /usr/local/redis-test/7.4.1/data -p
# 创建启动脚本
# vim /usr/local/redis-test/run-redis-5.sh
#!/bin/bash
# 配置参数
REDIS_PORT=6379 # Redis端口
REDIS_PASSWORD="testpasswd123" # Redis密码
REDIS_VERSION="5.0.14" # Redis版本
REDIS_DATA_DIR="/usr/local/redis-test/5.0.14/data" # 数据目录
REDIS_CONTAINER_NAME="redis-5" # 容器名称
REDIS_MEMORY="2gb" # 最大内存限制
REDIS_BIND="0.0.0.0" # Redis绑定地址
# 创建必要的目录
mkdir -p ${REDIS_DATA_DIR}
# 检查是否已存在同名容器
if [ "$(docker ps -aq -f name=${REDIS_CONTAINER_NAME})" ]; then
echo "发现同名容器,正在删除..."
docker rm -f ${REDIS_CONTAINER_NAME}
fi
# 启动Redis容器
docker run -d \
--name ${REDIS_CONTAINER_NAME} \
-p ${REDIS_PORT}:6379 \
-v ${REDIS_DATA_DIR}:/data \
--restart unless-stopped \
--memory=${REDIS_MEMORY} \
redis:${REDIS_VERSION} \
redis-server \
--appendonly yes \
--requirepass ${REDIS_PASSWORD} \
--maxmemory ${REDIS_MEMORY} \
--maxmemory-policy allkeys-lru \
--save 900 1 \
--save 300 10 \
--save 60 10000 \
--bind ${REDIS_BIND} \
--protected-mode yes
# 检查容器是否成功启动
if [ "$(docker ps -q -f name=${REDIS_CONTAINER_NAME})" ]; then
echo "Redis容器启动成功!"
echo "容器名称: ${REDIS_CONTAINER_NAME}"
echo "访问地址: localhost:${REDIS_PORT}"
echo "数据目录: ${REDIS_DATA_DIR}"
echo ""
echo "本地连接命令:"
echo "docker exec -it ${REDIS_CONTAINER_NAME} redis-cli -a ${REDIS_PASSWORD}"
echo ""
echo "远程连接命令:"
echo "redis-cli -h <服务器IP> -p ${REDIS_PORT} -a ${REDIS_PASSWORD}"
else
echo "Redis容器启动失败,请检查日志:"
docker logs ${REDIS_CONTAINER_NAME}
fi
# 显示容器运行状态
echo -e "\n容器运行状态:"
docker ps | grep ${REDIS_CONTAINER_NAME}
# vim /usr/local/redis-test/run-redis-7.sh
#!/bin/bash
# 配置参数
REDIS_PORT=6380 # Redis端口
REDIS_PASSWORD="testpasswd456" # Redis密码
REDIS_VERSION="7.4.1" # Redis版本
REDIS_DATA_DIR="/usr/local/redis-test/7.4.1/data" # 数据目录
REDIS_CONTAINER_NAME="redis-7" # 容器名称
REDIS_MEMORY="2gb" # 最大内存限制
REDIS_BIND="0.0.0.0" # Redis绑定地址
# 创建必要的目录
mkdir -p ${REDIS_DATA_DIR}
# 检查是否已存在同名容器
if [ "$(docker ps -aq -f name=${REDIS_CONTAINER_NAME})" ]; then
echo "发现同名容器,正在删除..."
docker rm -f ${REDIS_CONTAINER_NAME}
fi
# 启动Redis容器
docker run -d \
--name ${REDIS_CONTAINER_NAME} \
-p ${REDIS_PORT}:6379 \
-v ${REDIS_DATA_DIR}:/data \
--restart unless-stopped \
--memory=${REDIS_MEMORY} \
redis:${REDIS_VERSION} \
redis-server \
--appendonly yes \
--requirepass ${REDIS_PASSWORD} \
--maxmemory ${REDIS_MEMORY} \
--maxmemory-policy allkeys-lru \
--save 900 1 \
--save 300 10 \
--save 60 10000 \
--bind ${REDIS_BIND} \
--protected-mode yes
# 检查容器是否成功启动
if [ "$(docker ps -q -f name=${REDIS_CONTAINER_NAME})" ]; then
echo "Redis容器启动成功!"
echo "容器名称: ${REDIS_CONTAINER_NAME}"
echo "访问地址: localhost:${REDIS_PORT}"
echo "数据目录: ${REDIS_DATA_DIR}"
echo ""
echo "本地连接命令:"
echo "docker exec -it ${REDIS_CONTAINER_NAME} redis-cli -a ${REDIS_PASSWORD}"
echo ""
echo "远程连接命令:"
echo "redis-cli -h <服务器IP> -p ${REDIS_PORT} -a ${REDIS_PASSWORD}"
else
echo "Redis容器启动失败,请检查日志:"
docker logs ${REDIS_CONTAINER_NAME}
fi
# 显示容器运行状态
echo -e "\n容器运行状态:"
docker ps | grep ${REDIS_CONTAINER_NAME}
# 启动 redis 容器
bash /usr/local/redis-test/run-redis-5.sh
bash /usr/local/redis-test/run-redis-7.sh
# 测试登录
redis-cli -h 192.168.2.11 -p 6379 -a testpasswd123
redis-cli -h 192.168.2.11 -p 6380 -a testpasswd456
redis exporter配置
从 GitHub 下载对应版本:
cd /tmp
wget https://github.com/oliver006/redis_exporter/releases/download/v1.67.0/redis_exporter-v1.67.0.linux-amd64.tar.gz
tar xf redis_exporter-v1.67.0.linux-amd64.tar.gz
cd redis_exporter-v1.67.0.linux-amd64/
mv redis_exporter /usr/local/bin/
# 创建密码配置文件
# vim /var/lib/redis-passwd.json
{
"redis://192.168.2.11:6379":"testpasswd123",
"redis://192.168.2.11:6380":"testpasswd456"
}
# 使用 systemd 管理 redis_exporter
# 配置单元文件
# vim /etc/systemd/system/redis_exporter.service
[Unit]
Description=Prometheus Redis Exporter
After=network.target
[Service]
Type=simple
User=root
Group=root
Nice=-5
ExecStart=/usr/local/bin/redis_exporter \
--redis.password-file=/var/lib/redis-passwd.json \
--web.listen-address=0.0.0.0:9121 \
--redis-only-metrics
SyslogIdentifier=redis_exporter
Restart=always
# 启动和开机自启
systemctl start redis_exporter.service
systemctl enable redis_exporter.service
systemctl status redis_exporter.service
Prometheus 配置
一般情况下,job 中建议使用 file_sd_configs 而不是 static_configs 维护多实例的 target,这样可以使得配置文件结构更清晰,且便于管理。
# 添加 job
# vim /etc/prometheus/prometheus.yml
- job_name: 'redis_exporter'
file_sd_configs:
- files:
- '/etc/victoria-metrics/file_sd/redis.yml'
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- source_labels: ['__address__']
regex: 'redis://(.+):(\d+)'
replacement: '${1}'
target_label: 'host_ip'
- target_label: __address__
replacement: 127.0.0.1:9121
# 维护对应的子配置文件以实现自动发现
# vim /etc/prometheus/file_sd/redis.yml
- labels:
instance_name: "test-redis-5.0.14"
targets:
- 192.168.2.11:6379
- labels:
instance_name: "test-redis-7.4.1"
targets:
- 192.168.2.11:6380
# 重载 Prometheus
systemctl reload prometheus.service
查看 Prometheus web端的 target 抓取情况:
Grafana 展示
本文属于专题:Prometheus Exporter
- 使用 Redis Exporter 监控 Redis
- Prometheus 集成 Nginx 监控
- 云监控接入本地Prometheus
- 使用 MySQL Exporter 监控MySQL
- Blackbox 网络监控
- node_exporter 添加自定义指标
- 使用 node_exporter 实现路由器监控
引用链接
正文完
发表至: 监控
2024-12-31